interface Sortable {
  //接口属性
  length: number;
  //接口方法
  compare(leftIndex: number, rightIndex: number): boolean;
  swap(leftIndex: number, rightIndex: number): void;
}

//排序器
export abstract class Sorter {
  //定义将来会提供的方法，且接收的参数
  abstract compare(leftIndex: number, rightIndex: number): boolean;
  abstract swap(leftIndex: number, rightIndex: number): void;
  //定义将来会提供的属性
  abstract length: number;

  //排序具体实现方法
  sort(): void {
    const { length } = this;

    //外层遍历所有元素
    for (let i = 0; i < length - 1; i++) {
      //内层遍历除了最后一个元素的所有元素
      //因为最后的元素已经排列到正确的位置了
      //为什么 - i? 因为遍历次数就为 length - i - 1
      for (let j = 0; j < length - i - 1; j++) {
        if (this.compare(j, j + 1)) {
          this.swap(j, j + 1);
        }
      }
    }
  }
}
